﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Obligatorio1;
using Obligatorio1.Modelo;
using System.Globalization;
using Obligatorio1.Controladores;



namespace Agenda
{
    public partial class frmAgenda : Form
    {
        private static frmAgenda instance;
        public static frmAgenda getInstance()
        {
            if (instance == null)
                instance = new frmAgenda();
            return instance;
        }
        private frmAgenda()
        {
            InitializeComponent();
        }

        private void frmAgenda_Load(object sender, EventArgs e)
        {
            try
            {
                CargarAgenda();
                textBoxNombre.Focus();
                crearMEnu();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void crearMEnu()
        {
            ContextMenuStrip mnu = new ContextMenuStrip();
            ToolStripMenuItem mnuEli = new ToolStripMenuItem("Eliminar");
            //Assign event handlers
            mnuEli.Click += new EventHandler(mnuCopy_Click);
            //Add to main context menu
            mnu.Items.AddRange(new ToolStripItem[] { mnuEli });
            //Assign to datagridview
            gvNombres.ContextMenuStrip = mnu;
        }

        private void mnuCopy_Click(object sender, EventArgs e)
        {
            try
            {
                Persona persona = gvNombres.Rows[gvNombres.CurrentCell.RowIndex].DataBoundItem as Persona;
                ManejadorPersona.getInstance().borrarPersona(persona);
                CargarAgenda();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        public void CargarAgenda()
        {
            if (this.tabPages.SelectedTab.Name == "Nombres")
            {
                List<Persona> personas = ManejadorPersona.getInstance().listar();
                this.gvNombres.DataSource = personas;
                ArreglarFormatoFecha();
                gvNombres.SelectionMode = DataGridViewSelectionMode.FullRowSelect;


                if (gvNombres.Columns.Count > 0)
                {
                    //Acomodamos la grilla personas
                    gvNombres.Columns[3].Visible = false;
                    gvNombres.Columns[6].Visible = false;
                    gvNombres.Columns[7].Visible = false;
                    gvNombres.Columns[8].Visible = false;
                    gvNombres.Columns[9].Visible = false;
                }
                //columnas readonly
                foreach (DataGridViewColumn column in gvNombres.Columns)
                {
                    column.ReadOnly = true;
                }
                this.dateTimeFnacIni.Value = System.DateTime.Today;
                this.dateTimeFnacFin.Value = System.DateTime.Today;
                
                foreach(DataGridViewColumn col in gvNombres.Columns)
                    col.SortMode = DataGridViewColumnSortMode.Automatic;
            }
            else
            {
                CargarGruposEnGrilla();
            }

            
        }

        private void ArreglarFormatoFecha()
        {
            foreach (DataGridViewRow row in gvNombres.Rows)
            {
                row.Cells["fechaNacimiento"].Style.Format = "dd/MM/yyyy";
            }
        }

        public void CargarGruposEnGrilla()
        {
            List<Grupo> grupos = ManejadorGrupo.getInstance().listar();
            this.gvGrupos.DataSource = grupos;
            gvGrupos.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

            //columnas readonly
            foreach (DataGridViewColumn column in gvGrupos.Columns)
            {
                column.ReadOnly = true;
            }

            if (gvGrupos.Columns.Count > 0)
            {
                gvGrupos.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                gvGrupos.Columns[1].Visible = false;
            }
        }

        private void gvNombres_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex >= 0)
                {
                    Persona persona = gvNombres.Rows[gvNombres.CurrentCell.RowIndex].DataBoundItem as Persona;
                    frmPersona frmper = frmPersona.getInstance(persona, frmPersona.Modo.Lectura);
                    frmper.CargarPersona();
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnAddPersona_Click(object sender, EventArgs e)
        {
            try
            {
                frmPersona frmper = frmPersona.getInstance(null, frmPersona.Modo.Nuevo);
                frmper.CargarPersona();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void buttonActualizar_Click(object sender, EventArgs e)
        {
            try
            {
                this.CargarAgenda();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                String nombre = textBoxNombre.Text;
                String apellido = textBoxApellido.Text;
                String direccion = textBoxDireccion.Text;
                String telefono = textBoxTelefono.Text;
                String grupo = textBoxGrupo.Text;
                String email = textBoxEmail.Text;
                Order modo = radioButtonApellido.Checked ? Order.Apellido : Order.Nombre;

                if (this.chkBuscarPorFecha.Checked)
                {
                    DateTime fechaIni = this.dateTimeFnacIni.Value;
                    DateTime fechaFin = this.dateTimeFnacFin.Value;
                 
                    if(modo==Order.Apellido)
                        this.gvNombres.DataSource = ManejadorConsultas.getInstance().ListarPersonasCriterios(nombre, apellido, telefono, direccion, email, grupo, fechaIni, fechaFin, chkBuscarPorCumple.Checked, modo);
                    else
                        this.gvNombres.DataSource = ManejadorConsultas.getInstance().ListarPersonasCriterios(nombre, apellido, telefono, direccion, email, grupo, fechaIni, fechaFin, chkBuscarPorCumple.Checked);
                }
                else
                {
                    if (modo == Order.Apellido)
                        this.gvNombres.DataSource = ManejadorConsultas.getInstance().ListarPersonasCriterios(nombre, apellido, telefono, direccion, email, grupo, DateTime.MaxValue, DateTime.MaxValue, chkBuscarPorCumple.Checked, modo);
                    else
                        this.gvNombres.DataSource = ManejadorConsultas.getInstance().ListarPersonasCriterios(nombre, apellido, telefono, direccion, email, grupo, DateTime.MaxValue, DateTime.MaxValue, chkBuscarPorCumple.Checked);
                }
                this.ArreglarFormatoFecha();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void tabPages_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                CargarAgenda();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void chkBuscarPorFecha_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                this.dateTimeFnacFin.Enabled = this.chkBuscarPorFecha.Checked;
                this.dateTimeFnacIni.Enabled = this.chkBuscarPorFecha.Checked;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }

        }

        private void gvGrupos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex >= 0)
                {
                    Grupo grupo = gvGrupos.Rows[gvGrupos.CurrentCell.RowIndex].DataBoundItem as Grupo;
                    frmGrupo frmGru = frmGrupo.getInstance(grupo, frmGrupo.Modo.Lectura);
                    frmGru.CargarGrupo();
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnAgregarGrupo_Click(object sender, EventArgs e)
        {
            try
            {
                frmGrupo frmGru = frmGrupo.getInstance(null, frmGrupo.Modo.Nuevo);
                frmGru.CargarGrupo();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnActualizar_Click(object sender, EventArgs e)
        {
            try
            {
                CargarGruposEnGrilla();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnCSV_Click(object sender, EventArgs e)
        {
            try
            {
                this.pnlExportar.Visible = true;
                this.pnlExportar.BringToFront();
                this.txtPathExport.Text = "C:\\agenda.csv";
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnExplore_Click_1(object sender, EventArgs e)
        {
            try
            {
                saveFileDialog1.InitialDirectory = "C:\\";
                saveFileDialog1.Filter = "Archivo de Texto|*.txt";
                saveFileDialog1.FileName = txtPathExport.Text;
                if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    txtPathExport.Text = saveFileDialog1.FileName;
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnCancelar_Click_1(object sender, EventArgs e)
        {
            try
            {
                this.pnlExportar.Visible = false;
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            try
            {
                Exportador exp = Exportador.getInstance();
                if (!txtPathExport.Text.Equals(""))
                {
                    string nombreArchivo = txtPathExport.Text.Substring(txtPathExport.Text.LastIndexOf("\\") + 1);
                    exp.exportar(txtPathExport.Text, nombreArchivo, ';');
                    pnlExportar.Hide();
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Ocurrió el siguiente error:  " + exc.Message, "Error");
            }
        }
    }

    #region "Enums"
    public enum Order
    {
        Nombre = 0,
        Apellido = 1
    }
    #endregion
}
